<template>
  <div class="wrapper">
    <div class="pager-container">
      <div class="start-page"
           @click="clickToFirst">首页</div>
      <div class="last-page"
           @click="clickLast" >上一页</div>
      <div v-for="(btn,index) in config.btnSize" :key="index" class="other-page"
           v-if="(config.start+index<config.end+1) && config.start+index<=config.maxPage"
           :class="(config.start+index)==config.pageNo?'active':''"
           @click="clickBtn(config.start+index)"
      >{{ config.start+index }}</div>
      <div class="next-page"
           @click="clickNext">下一页</div>
      <div class="end-page"
           @click="clickToEnd">尾页</div>
    </div>
  </div>
</template>

<script>
/**
 * ComponentPager
 * @module '@/components/pager'
 * @desc 分页器
 * @date 2023年2月15日16:22:43
 * @param {Function} [commitFun]  - 由父组件传入的回调函数，用于发送跳页请求。
 * @param {Object} [baseConfig]  - 由父组件传入的对象，如{
        pageNo:1,
        pageSize:6,
        maxPage:0,
        btnSize:5,
      }。
 * @example 调用示例
 *  <Pager :commitFun="getDataByServer" :baseConfig="pagerConfig" ></Pager>
 **/
export default {
  name: "ComponentPager",
  props:['commitFun', 'baseConfig'],
  data(){
    return{
      // 组件初始化配置
      config:{pageNo:4, pageSize:10, btnSize:5, maxPage:10, start:2, end:8},
    }
  },
  mounted() {
    // 首次加载组件执行一次初始化配置。
    this.initConfig(this.baseConfig);
  },
  methods:{
    // 点击某一页
    clickBtn(page){
      if(page == this.config.pageNo) return;
      this.config.pageNo = page;
      this.commit();
    },
    // 点击下一页
    clickNext(){
      if (this.config.pageNo + 1 >this.config.maxPage) return;
      this.config.pageNo += 1;
      this.commit();
    },
    // 点击上一页
    clickLast(){
      if (this.config.pageNo - 1 < 1) return;
      this.config.pageNo -= 1;
      this.commit();
    },
    // 点击去第一页
    clickToFirst(){
      if(this.config.pageNo == 1) return;
      this.config.pageNo = 1;
      this.commit();
    },
    // 点击去最后一页
    clickToEnd(){
      if (this.config.pageNo == this.config.maxPage) return;
      this.config.pageNo = this.config.maxPage;
      this.commit();
    },
    // 调用父组件的请求接口。
    commit(){
      this.commitFun(this.config.pageNo, this.config.pageSize)
    },
    // 初始化配置
    initConfig(initConfig){
      this.config.pageNo = initConfig.pageNo;
      this.config.pageSize = initConfig.pageSize;
      this.config.maxPage = initConfig.maxPage;
      this.config.btnSize = initConfig.btnSize;

      // 初始化start和end
      if ((initConfig.pageNo-Math.floor(initConfig.btnSize/2)<1)){
        this.config.start = 1;
        this.config.end = initConfig.btnSize;
      }else{
        this.config.start = initConfig.pageNo - Math.floor(initConfig.btnSize/2);
        if ((initConfig.pageNo + Math.floor(initConfig.btnSize/2)>initConfig.maxPage)){
          this.config.end = initConfig.maxPage;
          this.config.start = initConfig.maxPage - initConfig.btnSize + 1;
        }else{
          this.config.end = initConfig.pageNo + Math.floor(initConfig.btnSize/2);
        }
      }
    }
  },
  watch:{
    // 当组件配置发送改变时，重新初始化组件配置。
    baseConfig:{
      handler(newValue, oldValue){
        this.initConfig(this.baseConfig);
      },
      deep:true,

    }
  },
}
</script>

<style  lang="less" scoped>
.wrapper{
  width: 100%;
  display: flex;
  justify-content: center;
  padding-bottom: 40px;
}

.pager-container{
  width: 700px;
  height: 50px;
  margin: 0 auto;
  color: #fff;
  display: flex;
  justify-content: space-between;
  font-size: 18px;
  font-weight: 600;

  div{
    width: 70px;
    height: 70px;
    background: #51446e;
    border-radius: 10px;
    text-align: center;
    line-height: 70px;
    box-shadow: 10px 10px 5px rgba(0, 0, 0, 0.1);
    user-select: none;
    cursor: pointer;
    &:hover{
      color: #51446e;
      background: #fff;
      transition: 0.3s;
    }
  }
  .active{
    color: #51446e;
    transform: scale(1.1);
    background: #fff;
  }
}
</style>